package com.shell.student;

import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText editNum;
    private EditText editName;
    private EditText editScore;
    private Button btnInsert;
    private Button btnSelect;
    private Button btnDelete;
    private Button btnUpdate;
    private EditText editShow;
    private DBHelper dbHelper;
    private SQLiteDatabase db;

    //删除按钮的对话框所用数据
    String[] deleteItem = new String[]{"按学号删除", "按姓名删除", "全部删除"};//单选框
    String[] selectItem = new String[]{"查询所有信息", "按学号查询", "按姓名查询"};
    private int itemSelect;
    private int item;//保存被选中元素下标

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    public void init() {
        editNum = findViewById(R.id.edit_num);
        editName = findViewById(R.id.edit_name);
        editScore = findViewById(R.id.edit_score);
        btnInsert = findViewById(R.id.btn_insert);
        btnSelect = findViewById(R.id.btn_select);
        btnDelete = findViewById(R.id.btn_delete);
        btnUpdate = findViewById(R.id.btn_update);
        editShow = findViewById(R.id.edit_show);

        btnInsert.setOnClickListener(this);
        btnSelect.setOnClickListener(this);
        btnDelete.setOnClickListener(this);
        btnUpdate.setOnClickListener(this);
        editNum.setOnClickListener(this);//点击“学号”编辑框
        editName.setOnClickListener(this);//点击“姓名”编辑框

        //获取数据库帮助类的对象
        dbHelper = new DBHelper(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_insert:
                clickBtnInsert();//点击“添加”
                break;
            case R.id.btn_select:
                clickBtnSelect();//点击“查询”
                break;
            case R.id.btn_delete:
                clickBtnDelete();//点击”删除“
                break;
            case R.id.btn_update:
                clickBtnUpdate();//点击“修改”
                break;
            case R.id.edit_num:
                clickEditNum();//点击“学号”编辑框
                break;
            case R.id.edit_name:
                clickEditName();//点击“姓名”编辑框
                break;
        }

    }

    //点击“添加”
    public void clickBtnInsert() {
        editNum.setEnabled(true);//学号编辑框可用
        editName.setEnabled(true);//姓名编辑框可用
        String num = editNum.getText().toString();//获取学号
        String name = editName.getText().toString();//获取姓名
        String score = editScore.getText().toString();//获取成绩

        if (num.isEmpty()) {
            Toast.makeText(this, "学号不能为空", Toast.LENGTH_LONG).show();
            return;
        }
        if (name.isEmpty()) {
            Toast.makeText(this, "姓名不能为空", Toast.LENGTH_LONG).show();
            return;
        }
        if (score.isEmpty()) {
            Toast.makeText(this, "成绩不能为空", Toast.LENGTH_LONG).show();
            return;
        }
        db = dbHelper.getWritableDatabase();//获取数据库对象，相当于连接数据库
        ContentValues values = new ContentValues();
        values.put(DBUtil.STU_ID, num);//列名，值
        values.put(DBUtil.STU_NAME, name);
        values.put(DBUtil.STU_SCORE, score);
        //表名，忽略的字段，值
        db.insert(DBUtil.TABLE_NAME, null, values);
        db.close();//关闭连接
        editName.setText("");
        editNum.setText("");
        editScore.setText("");
        clickBtnSelectAll();
    }

    //点击“查询”
    public void clickBtnSelect() {
        db = dbHelper.getWritableDatabase();//获取数据库对象，相当于连接数据库

        //如果学号和姓名编辑框均可用，说明是第一次点击查询按钮，则显示对话框
        if (editNum.isEnabled() && editName.isEnabled()) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);//创建对话框
            builder.setIcon(R.mipmap.ic_launcher);//设置图标
            builder.setTitle("请选择查询方式");//设置标题
            //参数：数组，默认选中项下标，监听器
            builder.setSingleChoiceItems(selectItem, 0, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {//第二个参数保存的是选中的项
                    itemSelect = which;
                }
            });
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();//关闭当前对话框
                }
            });//取消
            builder.setPositiveButton("查询", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (selectItem[itemSelect].equals(selectItem[0])) { //查询所有信息
                        editNum.setEnabled(false);//编辑框“学号”禁用
                        editName.setEnabled(false);//编辑框“姓名”禁用
                    } else if (selectItem[itemSelect].equals(selectItem[1])) {//按学号查询
                        editNum.setEnabled(true);//编辑框“学号”可编辑状态
                        editNum.setText("输入想查询的学号");
                        editName.setEnabled(false);//编辑框“姓名”禁用

                    } else {//按姓名查询
                        editNum.setEnabled(false);//编辑框“学号”禁用
                        editName.setEnabled(true);//编辑框“姓名”可用
                        editName.setText("输入想查询的姓名");
                    }
                    dialog.dismiss();//关闭当前对话框
                }
            });//确定
            builder.show();
        } else if (editNum.isEnabled() && !editName.isEnabled()) {//说明已经选择了“按学号查询”
            String num = editNum.getText().toString();//获取学号
            if (num.isEmpty()) {//学号为空
                Toast.makeText(this, "学号不能为空", Toast.LENGTH_LONG).show();
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
                editNum.setText("");
                editName.setText("");//清空姓名
                return;
            } else {
                //表名，字段名，条件，数组依次填充?，分组方式，接收having条件，排序方式
                Cursor cursor = db.query(DBUtil.TABLE_NAME, null, "_id=?", new String[]{num}, null, null, null);
                if (cursor.getCount() <= 0) {
                    editShow.setText("没有查询结果");
                } else {
                    editShow.setText("执行结果如下所示：\n学号  姓名  成绩 \n");
                    while (cursor.moveToNext()) {
                        String num1 = cursor.getString(0);
                        String name = cursor.getString(1);
                        String score = cursor.getString(2);
                        editShow.append(num1 + "  ");
                        editShow.append(name + "  ");
                        editShow.append(score + "\n");
                    }
                }
                db.close();
                editNum.setText("");
                editName.setText("");
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
            }

        } else if (!editNum.isEnabled() && editName.isEnabled()) {//说明已经选择了“按姓名查询”
            String name = editName.getText().toString();//获取姓名
            if (name.isEmpty()) {//姓名为空
                Toast.makeText(this, "姓名不能为空", Toast.LENGTH_LONG).show();
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
                return;
            } else {
                //表名，字段名，条件，数组依次填充?，分组方式，接收having条件，排序方式
                Cursor cursor = db.query(DBUtil.TABLE_NAME, null, "name=?", new String[]{name}, null, null, null);
                if (cursor.getCount() <= 0) {
                    editShow.setText("没有查询结果");
                } else {
                    editShow.setText("执行结果如下所示：\n学号  姓名  成绩 \n");
                    while (cursor.moveToNext()) {
                        String num = cursor.getString(0);
                        String name1 = cursor.getString(1);
                        String score = cursor.getString(2);
                        editShow.append(num + "  ");
                        editShow.append(name1 + "  ");
                        editShow.append(score + "\n");
                    }
                }
                db.close();
                editNum.setText("");
                editName.setText("");
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
            }

        } else if (!editNum.isEnabled() && !editName.isEnabled()) { //说明选择了全部查询
            clickBtnSelectAll();//调用查询所有信息的方法，展示结果
            editNum.setEnabled(true);//编辑框“学号”可用
            editName.setEnabled(true);//编辑框“姓名”可用
            editNum.setText("");
            editName.setText("");//清空姓名
            db.close();
        }
    }

    //查询所有信息
    public void clickBtnSelectAll() {
        db = dbHelper.getWritableDatabase();//获取数据库对象，相当于连接数据库
        //表名，列名，null，条件，
        Cursor cursor = db.query(DBUtil.TABLE_NAME, null, null, null, null, null, null);
        if (cursor.getCount() <= 0) {
            editShow.setText("没有查询结果");
        } else {
            editShow.setText("执行结果如下所示：\n学号  姓名  成绩 \n");
            while (cursor.moveToNext()) {
                String num = cursor.getString(0);
                String name = cursor.getString(1);
                String score = cursor.getString(2);
                editShow.append(num + "  ");
                editShow.append(name + "  ");
                editShow.append(score + "\n");
            }
        }
        db.close();
    }

    //点击”删除“
    public void clickBtnDelete() {
        db = dbHelper.getWritableDatabase();//获取数据库对象，相当于连接数据库

        //如果学号和姓名编辑框均可用，说明是第一次点击删除按钮，则显示对话框
        if (editNum.isEnabled() && editName.isEnabled()) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);//创建对话框
            builder.setIcon(R.mipmap.ic_launcher);//设置图标
            builder.setTitle("请选择删除方式");//设置标题
            //参数：数组，默认选中项下标，监听器
            builder.setSingleChoiceItems(deleteItem, 0, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {//第二个参数保存的是选中的项
                    item = which;
                }
            });
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();//关闭当前对话框
                }
            });//取消
            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (deleteItem[item].equals(deleteItem[0])) { //按学号删除
                        editNum.setEnabled(true);//编辑框“学号”可编辑状态
                        editNum.setText("输入想删除的学号");
                        editName.setEnabled(false);//编辑框“姓名”禁用
                    } else if (deleteItem[item].equals(deleteItem[1])) {//按姓名删除
                        editNum.setEnabled(false);//编辑框“学号”禁用
                        editName.setEnabled(true);//编辑框“姓名”可用
                        editName.setText("输入想删除的姓名");
                    } else {//全部删除
                        editNum.setEnabled(false);//编辑框“学号”禁用
                        editName.setEnabled(false);//编辑框“姓名”禁用
                    }
                    dialog.dismiss();//关闭当前对话框
                }
            });//确定
            builder.show();
        } else if (editNum.isEnabled() && !editName.isEnabled()) {//说明已经选择了“按学号删除”
            String num = editNum.getText().toString();//获取学号
            if (num.isEmpty()) {//学号为空
                Toast.makeText(this, "学号不能为空", Toast.LENGTH_LONG).show();
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
                editNum.setText("");
                editName.setText("");//清空姓名
                return;
            } else {
                //表名，条件，数组中的数据会依次替换占位符
                db.delete(DBUtil.TABLE_NAME, "_id=?", new String[]{num});
                clickBtnSelectAll();//调用查询方法，展示结果
                db.close();
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
                editNum.setText("");
                editName.setText("");//清空姓名
            }

        } else if (!editNum.isEnabled() && editName.isEnabled()) {//说明已经选择了“按姓名删除”
            String name = editName.getText().toString();//获取姓名
            if (name.isEmpty()) {//姓名为空
                Toast.makeText(this, "姓名不能为空", Toast.LENGTH_LONG).show();
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
                editNum.setText("");
                editName.setText("");//清空姓名
                return;
            } else {
                //表名，条件，数组中的数据会依次替换占位符
                db.delete(DBUtil.TABLE_NAME, "name=?", new String[]{name});
                clickBtnSelectAll();//调用查询方法，展示结果
                editNum.setText("");
                editName.setText("");//清空姓名
                editNum.setEnabled(true);//编辑框“学号”可用
                editName.setEnabled(true);//编辑框“姓名”可用
                db.close();
            }

        } else if (!editNum.isEnabled() && !editName.isEnabled()) { //说明选择了全部删除
            db.delete(DBUtil.TABLE_NAME, null, null);
            clickBtnSelectAll();//调用查询方法，展示结果
            db.close();
            editNum.setEnabled(true);//编辑框“学号”可用
            editName.setEnabled(true);//编辑框“姓名”可用
        }
    }

    //点击“修改”
    static boolean isUpdate = true; //判断“修改”按钮是否被点击过

    public void clickBtnUpdate() {
        db = dbHelper.getWritableDatabase();//获取数据库对象，相当于连接数据库
        if (isUpdate) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this); //新建对话框
            builder.setIcon(R.mipmap.ic_launcher);//设置图标
            builder.setTitle("请输入想修改的学号");
            View view = LayoutInflater.from(this).inflate(R.layout.layout_student_update, null);//从布局填充器填充
            builder.setView(view); //放置视图
            final EditText num = view.findViewById(R.id.deleteByNum);//获取自定义对话框中的“学号”

            builder.setPositiveButton("修改信息", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    int number = Integer.parseInt(num.getText().toString());//获取输入的学号
                    if (num.getText().toString().isEmpty()) {
                        dialog.dismiss();
                        return;
                    }

                    //表名，字段名，条件，数组依次填充?，分组方式，接收having条件，排序方式
                    Cursor cursor = db.query(DBUtil.TABLE_NAME, null, "_id=?", new String[]{number + ""}, null, null, null);
                    if (cursor.getCount() <= 0) {
                        editShow.setText("没有查询结果");
                    } else {
                        //将查询结果填充到当前页面
                        while (cursor.moveToNext()) {
                            String num = cursor.getString(0);
                            String name = cursor.getString(1);
                            String score = cursor.getString(2);
                            editNum.setText(num);
                            editNum.setEnabled(false);//禁止编辑学号
                            editName.setText(name);
                            editScore.setText(score);
                            dialog.dismiss();//隐藏对话框
                            isUpdate = false; //改变“修改”按钮状态标志
                        }
                    }
                }
            });

            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();//隐藏对话框
                }
            });
            builder.show();//显示当前自定义对话框
        }
        if (!isUpdate) {//按照页面上的信息执行修改
            String num = editNum.getText().toString();//获取学号
            String name = editName.getText().toString();//获取姓名
            String score = editScore.getText().toString();//获取成绩

            if (num.isEmpty()) {
                Toast.makeText(this, "学号不能为空", Toast.LENGTH_LONG).show();
                editNum.setEnabled(true);
                return;
            }
            if (name.isEmpty()) {
                Toast.makeText(this, "姓名不能为空", Toast.LENGTH_LONG).show();
                editNum.setEnabled(true);
                return;
            }
            if (score.isEmpty()) {
                Toast.makeText(this, "成绩不能为空", Toast.LENGTH_LONG).show();
                editNum.setEnabled(true);
                return;
            }
            db = dbHelper.getWritableDatabase();//获取数据库对象，相当于连接数据库
            ContentValues values = new ContentValues();
            values.put(DBUtil.STU_NAME, name);
            values.put(DBUtil.STU_SCORE, score);
            //表名，值，条件，填充前面的占位符
            db.update(DBUtil.TABLE_NAME, values, "_id=?", new String[]{num});
            clickBtnSelectAll(); //调用查询方法，便于观察结果
            db.close();
            isUpdate = true;
            editNum.setEnabled(true);
            editName.setText("");
            editNum.setText("");
            editScore.setText("");
        }
    }

    //点击“学号”编辑框
    public void clickEditNum() {
        editNum.setText("");
    }

    //点击“姓名”编辑框
    public void clickEditName() {
        editName.setText("");
    }
}